{"version":3,"file":"static/chunks/pages/shelters/[slug]/[id]-21959f033da3d351.js","mappings":"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","sources":["webpack://_N_E/?e769","webpack://_N_E/./core--client--components/src/components/atoms/AnimateItem/AnimateItem.tsx","webpack://_N_E/./core--client--components/src/components/atoms/ButtonLink/ButtonLink.tsx","webpack://_N_E/./core--client--components/src/lib/loaders/contentfulImageLoader.ts","webpack://_N_E/./src/components/molecules/ContactOrganization/ContactOrganization.tsx","webpack://_N_E/./src/components/molecules/CardArticle/CardArticle.tsx","webpack://_N_E/./src/components/organisms/ArticlesDisplay/ArticlesDisplay.tsx","webpack://_N_E/./src/components/organisms/PageWrapper/PageWrapper.tsx","webpack://_N_E/./src/components/organisms/ShelterContactInformation/ShelterContactInformation.tsx","webpack://_N_E/./src/lib/constants/constants/articles.ts","webpack://_N_E/./src/lib/constants/constants/pets.ts","webpack://_N_E/./src/lib/dataSource/content/content-base.ts","webpack://_N_E/./src/lib/dataSource/content/article.ts","webpack://_N_E/./src/lib/dataSource/location/getLocationLabel.ts","webpack://_N_E/./src/lib/dataSource/lostApi/common.ts","webpack://_N_E/./src/lib/utils/formatters/formatPhoneNumber.ts","webpack://_N_E/./src/lib/utils/getPetUrlPath/getPetUrlPath.ts","webpack://_N_E/./src/lib/utils/helpers/ObjectsHelpers/AppendAttributeIfExists.ts","webpack://_N_E/./core--client--components/src/lib/dataSource/contentful/client.ts","webpack://_N_E/./src/components/molecules/ShelterPageTitle/ShelterPageTitle.tsx","webpack://_N_E/./src/components/templates/ShelterDetailsTemplate/ShelterDetailsTemplate.tsx","webpack://_N_E/./src/lib/constants/constants/us-states.ts","webpack://_N_E/./src/lib/dataSource/location/abbreviateAddress.ts","webpack://_N_E/./src/lib/dataSource/lostApi/awo/legacyContext/legacyId.ts","webpack://_N_E/./src/lib/utils/helpers/legacy/hexadecimalToString.ts","webpack://_N_E/./src/pages/shelters/[slug]/[id]/index.tsx","webpack://_N_E/<anon>"],"sourcesContent":["\n (window.__NEXT_P = window.__NEXT_P || []).push([\n \"/shelters/[slug]/[id]\",\n function () {\n return require(\"private-next-pages/shelters/[slug]/[id]/index.tsx\");\n }\n ]);\n if(module.hot) {\n module.hot.dispose(function () {\n window.__NEXT_P.push([\"/shelters/[slug]/[id]\"])\n });\n }\n ","import {\n Variant,\n cubicBezier,\n motion,\n useAnimation,\n useInView,\n} from 'framer-motion';\nimport { useEffect, useRef } from 'react';\n\n/**\n * AnimateItem Props\n *\n * @interface IAnimateItem\n */\nexport interface IAnimateItem {\n /**\n * Children to animate\n *\n * @memberof IAnimateItem\n * @member {React.ReactNode} children\n */\n children: React.ReactNode;\n /**\n * From variant\n *\n * @memberof IAnimateItem\n * @member {Variant} [from]\n */\n from?: Variant;\n /**\n * To variant\n *\n * @memberof IAnimateItem\n * @member {Variant} [to]\n */\n to?: Variant;\n /**\n * Delay\n *\n * @memberof IAnimateItem\n * @default 0.2\n * @member {number} [delay]\n */\n delay?: number;\n /**\n * Duration\n *\n * @memberof IAnimateItem\n * @default 0.9\n * @member {number} [duration]\n */\n duration?: number;\n /**\n * Classes\n *\n * @memberof IAnimateItem\n * @default ''\n * @member {string} [className]\n */\n className?: string;\n}\n\n/**\n * AnimateItem\n *\n * @param {IAnimateItem} props - Props\n * @returns {React.ReactNode} - AnimateItem\n */\nconst AnimateItem: React.FC<IAnimateItem> = ({\n children,\n from,\n to,\n delay = 0.2,\n duration = 0.9,\n className = '',\n}: IAnimateItem) => {\n const ref = useRef(null);\n const controls = useAnimation();\n const inView = useInView(ref);\n\n useEffect(() => {\n if (inView) {\n controls.start('visible');\n }\n }, [controls, inView]);\n\n return (\n <motion.div\n className={className}\n ref={ref}\n initial={'hidden'}\n animate={controls}\n variants={{\n hidden: {\n opacity: 0,\n ...from,\n },\n visible: {\n opacity: 1,\n scale: 1,\n translateX: 0,\n translateY: 0,\n transition: {\n delay: delay,\n duration: duration,\n ease: cubicBezier(0.17, 0.55, 0.55, 1),\n },\n ...to,\n },\n }}\n data-testid=\"animate-item\"\n >\n {children}\n </motion.div>\n );\n};\n\nexport default AnimateItem;\n","import Link, { LinkProps } from 'next/link';\nimport React, { HTMLProps, Ref } from 'react';\n\n/**\n * IButtonLink Interface for the ButtonLink component\n *\n * @interface\n */\nexport interface IButtonLink {\n /**\n * The version of the button to display either light or dark\n *\n * @memberof IButtonLink\n * @member {'light' | 'dark'} variant\n */\n variant: 'light' | 'dark' | 'lightBlue' | 'pink';\n /**\n * Whether the button is disabled\n *\n * @memberof IButtonLink\n * @default false\n * @member {boolean} [disabled]\n */\n disabled?: boolean;\n /**\n * The target of the link\n *\n * @memberof IButtonLink\n * @member {string} [target]\n */\n target?: string;\n /**\n * The children of the button\n *\n * @memberof IButtonLink\n * @member {string} children\n */\n children: string;\n /**\n * The color scheme used for the button link\n *\n * @memberof IButtonLink\n * @default 'primary'\n * @member {'primary' | 'secondary' | 'tertiary'} [color]\n */\n color?: 'primary' | 'secondary' | 'tertiary';\n /**\n * The ref of the button link\n *\n * @memberof IButtonLink\n * @member {Ref<HTMLAnchorElement>} [ref]\n */\n ref?: Ref<HTMLAnchorElement>;\n /**\n * The className of the button link\n *\n * @memberof IButtonLink\n * @default ''\n * @member {string} [className]\n */\n className?: string;\n}\n\n/**\n * Button Link Props\n *\n * @typedef ButtonLinkProps\n */\nexport type ButtonLinkProps = IButtonLink &\n LinkProps &\n HTMLProps<HTMLAnchorElement>;\n\n/**\n * Button Base Font Properties This is the base font properties for the button.\n *\n * @constant {string} baseFont\n */\nconst baseFont =\n 'font-petco text-base font-bold border-b-[3px] pb-1.5 border-b-solid focus:ring-invisible transition-colors duration-200 ease-in-out';\n\n/**\n * Variant Classes Map This map is used to map the variant prop to the\n * appropriate tailwind classes.\n *\n * @constant {Record<string, Record<string, string>>} variantClasses\n */\nconst variantClasses = {\n primary: {\n light:\n 'text-secondaryBase-400 border-base-300 hover:text-base-300 hover:border-base-300',\n dark: 'text-neutral-100 border-neutral-100 hover:text-base-300 hover:border-base-300',\n lightBlue:\n 'text-mkNavy-400 border-mkLightBlue-400 hover:text-mkNavy-400 hover:border-mkNavy-400',\n pink: 'text-mkNavy-400 border-mkPink-400 hover:text-mkNavy-400 hover:border-mkNavy-400',\n },\n secondary: {\n light:\n 'text-secondaryBase-400 border-mkPink-400 hover:text-secondaryBase-400 hover:border-secondaryBase-400',\n dark: 'text-mkPink-400 border-mkPink-400 hover:text-neutral-100 hover:border-neutral-100',\n lightBlue:\n 'text-mkNavy-400 border-mkLightBlue-400 hover:text-mkNavy-400 hover:border-mkNavy-400',\n pink: 'text-mkNavy-400 border-mkPink-400 hover:text-mkNavy-400 hover:border-mkNavy-400',\n },\n tertiary: {\n light:\n 'text-secondaryBase-400 border-mkLightBlue-400 hover:text-secondaryBase-400 hover:border-secondaryBase-400',\n dark: 'text-mkLightBlue-400 border-mkLightBlue-400 hover:text-neutral-100 hover:border-neutral-100',\n lightBlue:\n 'text-mkNavy-400 border-mkLightBlue-400 hover:text-mkNavy-400 hover:border-mkNavy-400',\n pink: 'text-mkNavy-400 border-mkPink-400 hover:text-mkNavy-400 hover:border-mkNavy-400',\n },\n};\n\n/**\n * Wrapper Focus Styles This is the focus styles for the button.\n *\n * @constant {string} wrapperFocusStyles\n */\nconst wrapperFocusStyles =\n 'focus-visible:ring-1 focus-visible:ring-focus-400 focus-visible:rounded focus-visible:ring-offset-4 focus-visible:outline-0 focus-visible:outline-transparent';\n\n/**\n * Link Disabled Styles This is the disabled styles for the button.\n *\n * @constant {Record<string, string>} disabledStyles\n */\nconst disabledStyles = {\n light: 'text-neutral-500 border-neutral-500 cursor-not-allowed',\n dark: 'text-neutral-300 border-neutral-300 cursor-not-allowed',\n lightBlue:\n 'text-neutral-400 border-neutral-400 hover:text-neutral-400 hover:border-neutral-400 cursor-not-allowed',\n pink: 'text-neutral-400 border-neutral-400 hover:text-neutral-400 hover:border-neutral-400 cursor-not-allowed',\n};\n\n/**\n * Remove Focus Styles This is the focus styles for the button.\n *\n * @constant {string} removeFocusStyles\n */\nconst removeFocusStyles =\n 'focus:outline-none focus:ring-0 focus-visible:ring-0 focus-visible:outline-none';\n\n/**\n * ButtonLink - A button used to navigate to a different page.\n *\n * @param {IButtonLink} props - The props for the ButtonLink component\n * @returns {React.FC<ButtonLinkProps>} Button Link Component\n */\nconst ButtonLink: React.FC<ButtonLinkProps> = ({\n variant,\n href,\n as,\n disabled = false,\n children,\n replace,\n scroll,\n shallow,\n passHref,\n className = '',\n color = 'primary',\n ...rest\n}: ButtonLinkProps) => {\n const variantStyles = disabled\n ? disabledStyles[variant]\n : variantClasses[color][variant];\n const cls = `${baseFont} ${variantStyles} ${wrapperFocusStyles}`;\n const dataTestId = `button-link-${variant}-${disabled}`;\n\n return (\n <div\n className={`${className} ${removeFocusStyles}`}\n data-testid={dataTestId}\n >\n <Link\n href={href}\n as={as}\n passHref={passHref}\n replace={replace}\n scroll={scroll}\n shallow={shallow}\n className={`${cls} ${removeFocusStyles}`}\n {...rest}\n >\n {children}\n </Link>\n </div>\n );\n};\n\nexport default ButtonLink;\n","import { ImageLoaderProps } from \"next/legacy/image\";\n\n/**\n * Loads images from the CDN\n *\n * @param {ImageLoaderProps} params- Image loader props\n * @returns {string} - Image URL\n */\nfunction contentFulImageLoader({\n src,\n width,\n quality,\n}: ImageLoaderProps): string {\n if (quality) {\n return `${src}?q=${quality}&w=${width}&fm=webp`;\n } else {\n return `${src}?w=${width}&fm=webp`;\n }\n}\n\nexport default contentFulImageLoader;\n","import Icon, { IconType } from '@/components/atoms/Icon/Icon';\nimport formatPhoneNumber from '@/lib/utils/formatters/formatPhoneNumber';\n\n/**\n * IContactOrganization Interface for the ContactOrganization Component\n *\n * @interface IContactOrganization\n */\nexport interface IContactOrganization {\n /**\n * The full address of the organization\n *\n * @memberof IContactOrganization\n * @member {string} [address]\n */\n address?: string;\n /**\n * The email address of the organization\n *\n * @memberof IContactOrganization\n * @member {string} [email]\n */\n email?: string;\n /**\n * The phone number of the organization\n *\n * @memberof IContactOrganization\n * @member {string} [phone]\n */\n phone?: string;\n /**\n * The website of the organization\n *\n * @memberof IContactOrganization\n * @member {string} [website]\n */\n website?: string;\n /**\n * The type of organization ie Shelter / Rescue\n *\n * @memberof IContactOrganization\n * @default 'Shelter'\n * @member {string} [organizationType]\n */\n organizationType?: string;\n /**\n * The subject of the email\n *\n * @memberof IContactOrganization\n * @default 'Petco Love Lost Inquiry'\n * @member {string} [emailSubject]\n */\n emailSubject?: string;\n /**\n * The optional classes for the component.\n *\n * @memberof IContactOrganization\n * @default ''\n * @member {string} [classes]\n */\n classes?: string;\n}\n\n/**\n * ContactOrganization A component to display out the contact options for an\n * organization\n *\n * @param {IContactOrganization} props - The props for the ContactOrganization\n * @returns {React.FC<IContactOrganization>} ContactOrganization Component\n */\nconst ContactOrganization: React.FC<IContactOrganization> = ({\n address,\n email,\n phone,\n emailSubject = 'Petco Love Lost Inquiry',\n website,\n classes = '',\n}: IContactOrganization) => {\n const formattedPhone = (() => {\n if (!phone) {\n return '';\n }\n\n if (/[()-]/.test(phone)) {\n return phone;\n }\n\n return formatPhoneNumber(phone);\n })();\n\n return (\n <div\n className={`h-auto space-y-4 ${classes}`}\n data-testid=\"contact-organization\"\n >\n {website && (\n <div className=\"flex items-center\">\n <IconButton\n testid=\"contact-organization-website\"\n label={website}\n icon=\"globeLarge\"\n onClick={() => {\n window.open(website);\n }}\n />\n </div>\n )}\n\n {formattedPhone && (\n <div className=\"flex items-center\">\n <IconButton\n testid=\"contact-organization-phone\"\n label={formattedPhone}\n icon=\"phone\"\n onClick={() => {\n window.open(`tel:${formattedPhone}`);\n }}\n />\n </div>\n )}\n\n {email && (\n <div className=\"flex items-center\">\n <IconButton\n testid=\"contact-organization-email\"\n label={email}\n icon=\"envelopeLight\"\n onClick={() => {\n window.open(`mailto:${email}?subject=${emailSubject}`);\n }}\n />\n </div>\n )}\n\n {address && (\n <div className=\"flex items-center\">\n <IconButton\n testid=\"contact-organization-address\"\n label={address}\n icon=\"pin\"\n onClick={() => {\n window.open(\n `https://www.google.com/maps/search/?api=1&query=${address}`\n );\n }}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default ContactOrganization;\n\n/**\n * IIconButtonProps Interface for the IconButton Component\n *\n * @interface IIconButton\n */\ninterface IIconButton {\n /**\n * Button label\n *\n * @memberof IIconButton\n * @member {string} label\n */\n label: string;\n /**\n * Button icon\n *\n * @memberof IIconButton\n * @member {IconType} icon\n */\n icon: IconType;\n /**\n * Button onClick event handler\n *\n * @memberof IIconButton\n * @member {() => void} onClick\n */\n onClick: () => void;\n /**\n * Button testid\n *\n * @memberof IIconButton\n * @member {string} testid\n */\n testid: string;\n}\n\n/**\n * IconButton\n *\n * @param {IIconButton} props - The props for the IconButton\n * @returns {React.ReactComponentElement.Node} IconButton Component\n */\nfunction IconButton({ label, icon, onClick, testid }: IIconButton) {\n return (\n <button\n className=\"text-neutral-800 hover:text-base-300 hover:[&>span]:text-base-300 flex items-center gap-1.5 text-left\"\n onClick={onClick}\n data-testid={testid}\n >\n <Icon icon={icon} size={24} />\n\n <span className=\"underline\">{label}</span>\n </button>\n );\n}\n","import Paragraph from '@/components/atoms/Paragraph/Paragraph';\n\nimport Image, { ImageLoader } from 'next/legacy/image';\nimport Link from 'next/link';\n\n/**\n * ICardArticle Interface for the Card Article Component\n *\n * @interface ICardArticle\n */\nexport interface ICardArticle {\n /**\n * Title of the Article for the Card\n *\n * @memberof ICardArticle\n * @member {string} title\n */\n title: string;\n /**\n * The Excerpt of the Article to Display\n *\n * @memberof ICardArticle\n * @member {string} excerpt\n */\n excerpt: string;\n /**\n * The Image of the Article to display\n *\n * @memberof ICardArticle\n * @member {string} image\n */\n image: string;\n /**\n * The optional classes for the component\n *\n * @memberof ICardArticle\n * @default ''\n * @member {string} [classes]\n */\n classes?: string;\n /**\n * The optional imageClasses for the component\n *\n * @memberof ICardArticle\n * @default ''\n * @member {string} [imageClasses]\n */\n imageClasses?: string;\n /**\n * Url of the article to link to\n *\n * @memberof ICardArticle\n * @member {string} url\n */\n url: string;\n /**\n * The optional target for the url\n *\n * @memberof ICardArticle\n * @default '_self'\n * @member {'_blank' | '_self' | '_parent' | '_top'} [target]\n */\n target?: '_blank' | '_self' | '_parent' | '_top';\n /**\n * The loader function for the image\n *\n * @memberof ICardArticle\n * @member {ImageLoader} [loader]\n */\n loader?: ImageLoader;\n}\n\n/**\n * Card Article The Card Article Component that links to an url and displays an\n * image, title and excerpt\n *\n * @param {ICardArticle} props - The props for the Card Article Component\n * @returns {React.FC<ICardArticle>} Card Article Component\n */\nconst CardArticle: React.FC<ICardArticle> = ({\n title,\n excerpt,\n image,\n classes = '',\n url,\n imageClasses = '',\n target = '_self',\n loader,\n}: ICardArticle) => {\n return (\n <div\n data-testid=\"card-article\"\n className={`w-full cursor-pointer [&:has(:focus-visible)]:ring-1 [&:has(:focus-visible)]:ring-focus-400 sm:rounded-[20px] md:rounded-3xl ${classes}`}\n >\n <Link\n href={url}\n className=\"w-full focus:ring-0 focus:ring-offset-0 focus-visible:ring-offset-0 focus-visible:ring-0 focus-visible:border-none focus-visible:outline-none\"\n target={target}\n >\n <div\n className={`h-[218px] sm:h-[140px] md:h-72 relative rounded-2xl sm:rounded-[20px] md:rounded-3xl flex overflow-hidden ${imageClasses}`}\n >\n <Image\n data-testid=\"card-article-image\"\n src={image}\n layout=\"fill\"\n alt={`Image of ${title}`}\n objectFit=\"cover\"\n className=\"scale-100 hover:scale-[102%] transition-transform duration-100\"\n loader={loader}\n sizes=\"(max-width: 739px) 100vw, (max-width: 1199px) 33vw, 450px\"\n />\n </div>\n <div className=\"w-full mt-4 md:mt-6\">\n <span className=\"font-bold font-petco text-h5 text-mkNavy-400 line-clamp-2\">\n {title}\n </span>\n <Paragraph size=\"body4\" className=\"mt-3 font-petco line-clamp-2\">\n {excerpt}\n </Paragraph>\n </div>\n </Link>\n </div>\n );\n};\n\nexport default CardArticle;\n","import contentFulImageLoader from '@/component-library-lib/loaders/contentfulImageLoader';\nimport AnimateItem from '@/component-library/atoms/AnimateItem/AnimateItem';\nimport ButtonLink, {\n IButtonLink,\n} from '@/component-library/atoms/ButtonLink/ButtonLink';\nimport Heading from '@/components/atoms/Heading/Heading';\nimport CardArticle, {\n ICardArticle,\n} from '@/components/molecules/CardArticle/CardArticle';\n\n/**\n * IButtonLinkWithHref Interface for a Button link with a href\n *\n * @augments IButtonLink\n * @interface IButtonLinkWithHref\n */\nexport interface IButtonLinkWithHref extends IButtonLink {\n /**\n * The button link url\n *\n * @memberof IButtonLinkWithHref\n * @member {string} href\n */\n href: string;\n}\n\n/**\n * IArticlesDisplay Interface for ArticlesDisplay component\n *\n * @interface IArticlesDisplay\n */\nexport interface IArticlesDisplay {\n /**\n * The title of the articles display.\n *\n * @memberof IArticlesDisplay\n * @member {string} title\n */\n title: string;\n /**\n * An array of card articles to display.\n *\n * @memberof IArticlesDisplay\n * @member {ICardArticle[]} articles\n */\n articles: ICardArticle[];\n /**\n * The optional button link.\n *\n * @memberof IArticlesDisplay\n * @member {IButtonLinkWithHref} [buttonLink]\n */\n buttonLink?: IButtonLinkWithHref;\n /**\n * The optional classes to be applied to the component.\n *\n * @memberof IArticlesDisplay\n * @default ''\n * @member {string} [classes]\n */\n classes?: string;\n /**\n * The optional imageClasses to be applied to the image inside a card.\n *\n * @memberof IArticlesDisplay\n * @default ''\n * @member {string} [imageClasses]\n */\n imageClasses?: string;\n}\n\n/**\n * ArticlesDisplay Organism for displaying articles\n *\n * @param {IArticlesDisplay} props - The props for the ArticlesDisplay component\n * @returns {React.FC<IArticlesDisplay>} ArticlesDisplay Component\n */\nconst ArticlesDisplay: React.FC<IArticlesDisplay> = ({\n title,\n articles,\n buttonLink,\n classes = '',\n imageClasses = '',\n}: IArticlesDisplay) => {\n return (\n <div\n data-testid=\"articles-display\"\n className={`max-w-[1360px] mx-auto ${classes}`}\n >\n <AnimateItem from={{ translateY: 20 }}>\n <div className=\"flex flex-col justify-between mb-8 space-y-4 sm:flex-row sm:space-y-0 sm:items-center md:mb-12\">\n <Heading size=\"h3\" font=\"petco\" className=\"text-secondaryBase-400 \">\n {title}\n </Heading>\n {buttonLink && <ButtonLink {...buttonLink} />}\n </div>\n </AnimateItem>\n {articles && (\n <div className=\"grid sm:grid-cols-3 grid-cols-1 md:gap-x-8 gap-6\">\n {articles.map((article, index) => (\n <div className=\"flex items-center justify-stretch\" key={index}>\n <CardArticle\n {...article}\n imageClasses={imageClasses}\n loader={contentFulImageLoader}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default ArticlesDisplay;\n","import { ReactNode } from 'react';\n\n/**\n * IPageWrapper\n *\n * @interface IPageWrapper\n */\nexport interface IPageWrapper {\n /**\n * The content of the page.\n *\n * @memberof IPageWrapper\n * @member {ReactNode} children\n */\n children: ReactNode;\n /**\n * The classes to apply to the component.\n *\n * @memberof IPageWrapper\n * @default ''\n * @member {string} [classes]\n */\n classes?: string;\n}\n\n/**\n * Page Wrapper Used to wrap the entire page in a fixed size container.\n *\n * @param {IPageWrapper} props - The props for the PageWrapper component\n * @returns {React.FC<IPageWrapper>} PageWrapper Component\n */\nconst PageWrapper: React.FC<IPageWrapper> = ({\n children,\n classes = '',\n}: IPageWrapper) => {\n return <div className={`max-w-[1440px] mx-auto ${classes}`}>{children}</div>;\n};\n\nexport default PageWrapper;\n","import Paragraph from '@/components/atoms/Paragraph/Paragraph';\nimport ContactOrganization from '@/components/molecules/ContactOrganization/ContactOrganization';\n\n/**\n * IShelterContactInformation\n *\n * @interface IShelterContactInformation\n */\nexport interface IShelterContactInformation {\n /**\n * The overline text to display.\n *\n * @memberof IShelterContactInformation\n * @member {string} [overline]\n */\n overline?: string;\n /**\n * The name of the shelter.\n *\n * @memberof IShelterContactInformation\n * @member {string} name\n */\n name: string;\n /**\n * The phone number of the shelter.\n *\n * @memberof IShelterContactInformation\n * @member {string} [phone]\n */\n phone?: string;\n /**\n * The email of the shelter.\n *\n * @memberof IShelterContactInformation\n * @member {string} [email]\n */\n email?: string;\n /**\n * The address of the shelter.\n *\n * @memberof IShelterContactInformation\n * @member {string} [address]\n */\n address?: string;\n /**\n * The website of the shelter\n *\n * @memberof IShelterContactInformation\n * @member {string} [website]\n */\n website?: string;\n /**\n * The optional classes to apply to the component.\n *\n * @memberof IShelterContactInformation\n * @default ''\n * @member {string} [classes]\n */\n classes?: string;\n}\n\n/**\n * ShelterContactInformation An organism used to display out all of the\n * Shelter's Contact Information\n *\n * @param {IShelterContactInformation} props - The props for the\n * ShelterContactInformation component\n * @returns {React.FC<IShelterContactInformation>} ShelterContactInformation\n * Component\n */\nconst ShelterContactInformation: React.FC<IShelterContactInformation> = ({\n overline,\n name,\n phone,\n email,\n website,\n address,\n classes = '',\n}: IShelterContactInformation) => {\n return (\n <div\n data-testid=\"shelter-contact-information\"\n className={`py-10 sm:py-12 md:py-16 border-y-[1px] border-y-neutral-300 border-y-solid ${classes}`}\n >\n <div className=\"text-center mx-auto sm:max-w-2/3\">\n {overline && (\n <Paragraph size=\"overline\" font=\"petco\" className=\"mb-1\">\n {overline}\n </Paragraph>\n )}\n <Paragraph\n size=\"body1\"\n styling=\"bold\"\n font=\"petco\"\n className=\"mb-6 md:mb-8\"\n >\n {name}\n </Paragraph>\n </div>\n <ContactOrganization\n phone={phone}\n email={email}\n address={address}\n website={website}\n classes=\"flex flex-col justify-center items-center\"\n />\n </div>\n );\n};\n\nexport default ShelterContactInformation;\n","/**\n * Array of the article slug names to display in the shelter details page\n *\n * @constant {string[]}\n */\nexport const shelterDetailsArticlesSlugNames = [\n 'lost-dog-reunites-with-best-friend',\n 'how-to-care-for-your-lost-cat-after-they-come-home',\n 'how-to-help-lost-and-found-pets-near-me',\n];\n\n/**\n * The article slug names for the found search; If the user is searching for\n * FOUND pets, that means the user LOST a pet\n *\n * @constant {string[]} foundSearchArticleSlugNames\n */\nexport const foundSearchArticleSlugNames = [\n 'how-to-find-a-lost-dog',\n 'do-lost-pets-find-their-way-home',\n 'how-to-find-a-lost-cat',\n];\n\n/**\n * The article slug names for the lost search; If the user is searching for LOST\n * pets, that means the user FOUND a pet\n *\n * @constant {string[]} lostSearchArticleSlugNames\n */\nexport const lostSearchArticleSlugNames = [\n 'what-to-do-if-you-find-a-lost-cat-or-dog',\n 'how-to-catch-a-shy-lost-dog',\n 'are-stray-cats-and-dogs-potentially-lost-pets',\n];\n\n/**\n * The article slug names for the microchip search page\n *\n * @constant {string[]} microchipSearchArticlesSlugNames\n */\nexport const microchipSearchArticlesSlugNames = [\n 'what-is-a-pet-microchip-and-how-does-it-work',\n 'do-lost-pets-find-their-way-home',\n 'how-to-find-a-lost-cat',\n];\n","import {\n PetUrlPathOwnerType,\n PetUrlPathSearchType,\n} from '@/lib/constants/types/pets';\n\n/** Index used for age number */\nlet index = 0;\n\n/**\n * The type of the unknown value of pet dropdown input fields\n *\n * @typedef {string} UnknownValueType\n */\nexport type UnknownValueType = 'unknown';\n\n/**\n * The unknown value for the dropdowns\n *\n * @constant {string} unknownValue\n */\nexport const unknownValue: UnknownValueType = 'unknown';\n\n/** Number Values used for age dropdown */\nconst baseAgeValues = Array.from({ length: 30 }, () => {\n index++;\n return {\n name: `${index} year${index > 1 ? 's' : ''} old`,\n value: index.toString(),\n };\n});\n\n/** The unknown value for the pet dropdown */\nexport const petDropdownUnknownValue = {\n name: 'Unknown',\n value: unknownValue,\n};\n\n/** All Values used to fill age dropdown */\nexport const ageValues = [\n petDropdownUnknownValue,\n { name: '<1', value: '0' },\n ...baseAgeValues,\n];\n\n/** All Values used to fill pet sex dropdown */\nexport const petSexDropdownValues = [\n {\n name: 'Male',\n value: 'male',\n },\n {\n name: 'Female',\n value: 'female',\n },\n petDropdownUnknownValue,\n];\n\n/** Values used to fill the species dropdown */\nexport const speciesDropdownValues = [\n {\n name: 'Dog',\n value: 'dog',\n },\n {\n name: 'Cat',\n value: 'cat',\n },\n];\n\nexport const alteredDropdownValues = [\n {\n name: 'Yes',\n value: 'yes',\n },\n {\n name: 'No',\n value: 'no',\n },\n petDropdownUnknownValue,\n];\n\n/** The search radius options */\nexport const searchRadiusOptions = [\n { label: '10', value: 10 },\n { label: '25', value: 25 },\n { label: '50', value: 50 },\n { label: '75', value: 75 },\n { label: '100', value: 100 },\n { label: '200', value: 200 },\n { label: 'Unlimited', value: 3000 },\n];\n\n/**\n * The valid pet statuses to allow displaying details for\n *\n * @constant {string[]} validStatus\n */\nexport const validStatus: string[] = ['active'];\n\n/**\n * The valid pet statuses to allow displaying details for\n *\n * @constant {PetUrlPathOwnerType} validStatus - The valid pet statuses to allow\n * displaying details for\n * @property {string} user - The url path segment for a user pet\n * @property {string} awo - The url path segment for an awo pet\n */\nexport const petUrlPathOwnerTypes: PetUrlPathOwnerType = {\n user: 'u',\n awo: 's',\n};\n\n/**\n * The valid url path search types\n *\n * @constant {object} petUrlPathSearchTypes\n * @property {string} lostUserPet - The url path segment for a lost user pet\n * search type\n * @property {string} foundUserPet - The url path segment for a found user pet\n * search type\n * @property {string} foundOrgPet - The url path segment for a found org pet\n * search type\n */\nexport const petUrlPathSearchTypes: PetUrlPathSearchType = {\n lostUserPet: 'lost',\n foundUserPet: 'found',\n foundOrgPet: 'found',\n};\n","/**\n * Content Type Enum for content types\n *\n * @enum\n */\nexport enum ContentType {\n Article,\n Author,\n}\n\n/**\n * Content Status Enum for content statuses\n *\n * @enum\n */\nexport enum ContentStatus {\n Draft,\n Published,\n}\n\n/**\n * Content Base Abstract Class for Content Types\n *\n * @abstract\n * @class\n * @property {ContentType} type - The type of content\n * @property {ContentStatus} status - The status of the content\n */\nexport default abstract class Content {\n type: ContentType;\n\n status: ContentStatus;\n\n /**\n * @param {ContentType} type - The type of content\n * @param {ContentStatus} status - The status of the content\n */\n constructor(type: ContentType, status: ContentStatus) {\n this.type = type;\n this.status = status;\n }\n}\n","import { ICardArticle } from '@/components/molecules/CardArticle/CardArticle';\nimport Content, { ContentStatus, ContentType } from './content-base';\n\n/**\n * Article Interface for Article Content Type\n *\n * @interface\n */\nexport interface IContent {\n /** Title of the Article */\n title: string;\n /** Author of the Article */\n authorName: string;\n /** Author Slug of the Article */\n authorSlug: string;\n /** Date the Article was published */\n publishedDate: Date;\n /** Slug of the Article */\n slug: string;\n /** Featured Photo of the Article */\n featuredPhoto: string;\n /** Body Content of the Article */\n contentBody: string;\n /** Excerpt of the Article */\n excerpt: string;\n /** Category of the Article */\n categoryId: string;\n}\n\n/**\n * Article Class for Article Content Type\n *\n * @class\n * @property {string} title - The title of the article\n * @property {Date} publishedDate - The date the article was published\n * @property {string} slug - The slug of the article\n * @property {string} featuredPhoto - The featured photo of the article\n * @property {string} contentBody - The content of the article\n * @requires Content\n */\nexport default class Article extends Content {\n /**\n * Title of the Article\n *\n * @memberof Article\n * @member {string} title\n */\n title: string;\n\n /**\n * Author of the Article\n *\n * @memberof Article\n * @member {string} authorName\n */\n authorName: string;\n\n /**\n * Author slug of the Article\n *\n * @memberof Article\n * @member {string} authorSlug\n */\n authorSlug: string;\n\n /**\n * Date the Article was published\n *\n * @memberof Article\n * @member {Date} publishedDate\n */\n publishedDate: Date;\n\n /**\n * Slug of the Article\n *\n * @memberof Article\n * @member {string} slug\n */\n slug: string;\n\n /**\n * Featured Photo of the Article\n *\n * @memberof Article\n * @member {string} featuredPhoto\n */\n featuredPhoto: string;\n\n /**\n * Content Body of the Article\n *\n * @memberof Article\n * @member {string} contentBody\n */\n contentBody: string;\n\n /**\n * Excerpt of the Article\n *\n * @memberof Article\n * @member {string} excerpt\n */\n excerpt: string;\n\n /**\n * Category id of the Article\n *\n * @memberof Article\n * @member {string} category\n */\n categoryId: string;\n\n /**\n * The base path for articles\n *\n * @memberof Article\n * @member {'/articles'} articlesBasePath\n */\n articlesBasePath: `/${string}` = '/articles';\n\n /**\n * The base path for authors\n *\n * @memberof Article\n * @member {'/author'} authorBasePath\n */\n authorBasePath = '/author';\n\n /**\n * Article Data Constructor\n *\n * @param {IContent} content - The content data\n */\n constructor({\n title,\n authorName,\n authorSlug,\n slug,\n featuredPhoto,\n contentBody,\n excerpt,\n categoryId,\n publishedDate,\n }: IContent) {\n super(ContentType.Article, ContentStatus.Published);\n\n this.title = title;\n this.authorName = authorName;\n this.authorSlug = authorSlug;\n this.publishedDate = publishedDate;\n this.slug = slug;\n this.contentBody = contentBody;\n this.excerpt = excerpt;\n this.featuredPhoto = featuredPhoto;\n this.categoryId = categoryId;\n }\n\n /**\n * Get Title Returns the Title of the Article\n *\n * @returns {string} - Title of the Article\n */\n getTitle(): string {\n return this.title;\n }\n\n /**\n * Get Featured Photo Returns the Featured Photo of the Article\n *\n * @returns {string} - Featured Photo URL of the Article\n */\n getFeaturedPhoto(): string {\n return this.featuredPhoto;\n }\n\n /**\n * Get Slug Returns the Slug of the Article\n *\n * @returns {string} - Slug of the Article\n */\n getSlug(): string {\n return this.slug;\n }\n\n /**\n * Get Author Link Returns the link to the Author of the Article\n *\n * @returns {string} - Author link\n */\n getAuthorUrl(): string {\n return `${this.authorBasePath}/${this.authorSlug}`;\n }\n\n /**\n * Get Content of the Article Returns the Content of the Article\n *\n * @returns {string} - Content of the Article\n */\n getContent(): string {\n return this.contentBody;\n }\n\n /**\n * Get Formatted Publication Date of the Article\n *\n * @returns {string} - Formatted Publication Date of the Article\n */\n getFormattedPublishedDate(): string {\n const date = new Date(this.publishedDate);\n\n return date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n }\n\n /**\n * Get the article url\n *\n * @returns {string} - Url of the Article\n */\n getArticleUrl(): `/${string}` {\n return `${this.articlesBasePath}/${this.slug}`;\n }\n\n /**\n * Get the card article for the Articles Display component\n *\n * @returns {string} - Article card of the Article\n */\n getCardArticle(): ICardArticle {\n return {\n title: this.title,\n excerpt: this.excerpt,\n url: this.getArticleUrl(),\n image: this.featuredPhoto,\n };\n }\n}\n","/**\n * Get location label params\n *\n * @interface\n */\ninterface GetLocationLabelParams {\n /** The location address */\n address?: string;\n /** The location zip */\n zip?: string;\n /** The location city */\n city?: string;\n /** The location state */\n state?: string;\n /** The location country */\n countryCode?: string;\n}\n\n/**\n * Get the place label from the location data\n *\n * @param {GetLocationLabelParams} params - The location data\n * @returns {string} - The place label\n */\nfunction getLocationLabel({\n address,\n zip,\n city,\n state,\n countryCode,\n}: GetLocationLabelParams): string {\n let placeLabel = '';\n\n const placeLabelItems = [address, city];\n\n if (state !== undefined && zip !== undefined) {\n placeLabelItems.push(`${state} ${zip}`);\n } else if (state !== undefined) {\n placeLabelItems.push(state);\n } else if (zip !== undefined) {\n placeLabelItems.push(zip);\n }\n placeLabelItems.push(countryCode);\n\n placeLabelItems.forEach(\n /**\n * Add each item to the place label if it is defined\n *\n * @param {string | undefined} item - The item to add to the label\n * @returns {void}\n */\n (item: string | undefined): void => {\n /**\n * There is a known issue where a geo-point might not have attached a\n * address information\n */\n if (item === undefined) return;\n\n /**\n * If this is the first known item, do not add a comma. Otherwise, add a\n * comma and the item to the label.\n */\n if (placeLabel.length === 0) {\n placeLabel += item;\n } else {\n placeLabel += `, ${item}`;\n }\n }\n );\n\n return removeCommaAfterDot(placeLabel);\n}\n\n/**\n * Remove comma after dot. This is used to remove the comma right after address\n * abbreviations. As requested on PD-230.\n *\n * Example: 123 Main St., New York becomes \"123 Main St. New York\"\n *\n * @param {string} str - The string to transform.\n * @returns {string} - The transformed string.\n * @see https://petcofoundation.atlassian.net/browse/PD-230?focusedCommentId=29297\n */\nfunction removeCommaAfterDot(str: string) {\n return str.replace(/\\.,/, '.');\n}\n\nexport default getLocationLabel;\n","import { PetcoLoveSDK } from '@petcolove/lost--client--api-sdk';\n\n/**\n * Initialize the SDK\n *\n * @returns {PetcoLoveSDK} The SDK instance\n */\nexport function initSDK(): PetcoLoveSDK {\n /**\n * The PLL API base URL\n *\n * @constant {string | undefined} pllApiBaseUrl\n */\n const pllApiBaseUrl =\n process.env.NEXT_PUBLIC_PLL_API_BASE_URL ??\n process.env.STORYBOOK_PLL_API_BASE_URL;\n /**\n * The PLL Websocket base URL\n *\n * @constant {string | undefined} pllWebsocketBaseUrl\n */\n const pllWebsocketBaseUrl =\n process.env.NEXT_PUBLIC_PLL_WEBSOCKET_BASE_URL ??\n process.env.STORYBOOK_PLL_WEBSOCKET_BASE_URL;\n\n if (!pllApiBaseUrl) {\n throw new Error('NEXT_PUBLIC_PLL_API_BASE_URL is not defined');\n }\n\n if (!pllWebsocketBaseUrl) {\n throw new Error('NEXT_PUBLIC_PLL_WEBSOCKET_BASE_URL is not defined');\n }\n\n const sdk = new PetcoLoveSDK(pllApiBaseUrl, pllWebsocketBaseUrl);\n\n return sdk;\n}\n\nexport const sdk: PetcoLoveSDK = initSDK();\n","/**\n * Format Value Format the input value based on the pattern passed in\n *\n * @param {string} value - The input value\n * @param {number[]} [pattern=[3, 3, 4]] - The pattern to use for formatting.\n * Default is `[3, 3, 4]`\n * @returns {void}\n */\nconst formatPhoneNumber = (\n value: string,\n pattern: [number, number, number] = [3, 3, 4]\n): string => {\n /** Replace all non-numeric values from value */\n const numericValue = value.replace(/\\D/g, '');\n\n let formattedValue = numericValue;\n\n if (\n numericValue.length > pattern[0] &&\n numericValue.length < pattern[0] + pattern[1] + 1\n ) {\n formattedValue =\n '(' +\n numericValue.substring(0, pattern[0]) +\n ') ' +\n numericValue.substring(pattern[0], numericValue.length);\n } else if (\n numericValue.length >= pattern[0] + pattern[1] + 1 &&\n numericValue.length <= 10\n ) {\n formattedValue =\n '(' +\n numericValue.substring(0, pattern[0]) +\n ') ' +\n numericValue.substring(pattern[0], pattern[0] + pattern[1]) +\n '-' +\n numericValue.substring(pattern[0] + pattern[1], numericValue.length);\n }\n\n return formattedValue;\n};\n\nexport default formatPhoneNumber;\n","import {\n petUrlPathOwnerTypes,\n petUrlPathSearchTypes,\n} from '@/lib/constants/constants/pets';\nimport {\n ListingTypeKey,\n PetUrlPathOwnerSegment,\n SearchType,\n} from '@/lib/constants/types/pets';\nimport getBasePath from '@/lib/utils/getBasePath/getBasePath';\nimport { UserTypes } from '@petcolove/lost--client--api-sdk/dist/concrete/sdks/constants/types';\n\n/**\n * The valid pet url\n *\n * @type {string}\n */\nexport type PetUrl =\n `${string}/pet/${SearchType}/${PetUrlPathOwnerSegment}/${number}/`;\n\n/**\n * Get the owner type segment from the listing type\n *\n * @param {ListingTypeKey} listingType - The pet listing type\n * @returns {PetUrlPathOwnerSegment} The owner type segment\n */\nconst getOwnerTypeSegment = (\n listingType: ListingTypeKey\n): PetUrlPathOwnerSegment => {\n const ownerType: UserTypes = listingType.toLowerCase().includes('user')\n ? 'user'\n : 'awo';\n\n return petUrlPathOwnerTypes[ownerType];\n};\n\n/**\n * Describe the params for the getPetUrl function from a listing type\n *\n * @type {object}\n */\ntype IGetPetUrlFromListingTypeParams = {\n /** The pet listing type */\n listingType: ListingTypeKey;\n};\n\n/**\n * Describe the params for the getPetUrl function from a search type and owner\n * type\n *\n * @type {object}\n */\ntype IGetUrlFromSearchTypeAndOwnerParams = {\n /** The search type */\n searchType: SearchType;\n /** The owner type */\n ownerType: UserTypes;\n};\n\n/**\n * Describe the params for the getPetUrl function\n *\n * @type {object}\n */\ntype GetPetUrlParams = {\n /** The pet id */\n id: number;\n /** Optional flag to include base path in url */\n excludeBasePath?: boolean;\n} & (IGetPetUrlFromListingTypeParams | IGetUrlFromSearchTypeAndOwnerParams);\n\n/**\n * Get the pet url from the id and listing type\n *\n * @param {GetPetUrlParams} params - The params for the function\n * @returns {string} The pet url\n */\nexport default function getPetUrlPath(params: GetPetUrlParams): PetUrl {\n /**\n * The pet id\n *\n * @property {number} id - The pet id\n */\n const { id, excludeBasePath } = params;\n\n /** Get the pet url from the listing type */\n if ('listingType' in params) {\n const { listingType } = params as IGetPetUrlFromListingTypeParams;\n /**\n * The path url segment for the owner type\n *\n * @constant {PetUrlPathOwnerSegment} ownerTypeSegment\n */\n const ownerTypeSegment = getOwnerTypeSegment(listingType);\n /**\n * The path url segment for the search type\n *\n * @constant {SearchType} searchTypeSegment\n */\n const searchTypeSegment: SearchType = petUrlPathSearchTypes[listingType];\n\n return `${\n excludeBasePath ? '' : getBasePath()\n }/pet/${searchTypeSegment}/${ownerTypeSegment}/${id}/`;\n }\n /** Get The pet url from the search type and owner type */\n\n /**\n * The path url segment for the owner type\n *\n * @property {PetUrlPathOwnerSegment} ownerType - The owner type\n * @property {SearchType} searchType - The search type\n */\n const { searchType: petType, ownerType } =\n params as IGetUrlFromSearchTypeAndOwnerParams;\n\n return `${excludeBasePath ? '' : getBasePath()}/pet/${petType}/${\n petUrlPathOwnerTypes[ownerType]\n }/${id}/`;\n}\n\n/**\n * Interface for the getPetUrl function\n *\n * @interface IGetPetUrl\n */\nexport interface IGetPetUrl {\n /**\n * The pet id\n *\n * @memberof IGetPetUrl\n * @member {string | number} id\n */\n id: string | number;\n /**\n * The type of the pet\n *\n * @memberof IGetPetUrl\n * @member {'lost' | 'found' | 'sighting'} type\n */\n type: 'lost' | 'found' | 'sighting';\n /**\n * The owner type of the pet\n *\n * @memberof IGetPetUrl\n * @member {string} [ownerType]\n */\n ownerType?: string;\n /**\n * The external url of the pet\n *\n * @memberof IGetPetUrl\n * @member {string | null} [url]\n */\n url?: string | null;\n /**\n * The source of the external url\n *\n * @memberof IGetPetUrl\n * @member {string | null} [source]\n */\n source?: string | null;\n}\n\n/**\n * Build URL for different pet types, preferring the incoming external URL for\n * external pets.\n *\n * @param {IGetPetUrl} params - The params for the function\n * @returns {string} - The full pet URL the card will link to\n * @throws {Error} - If the pet has a non-numeric ID and no external URL\n */\nexport function getPetUrl({\n id,\n type,\n ownerType,\n url,\n source,\n}: IGetPetUrl): string {\n if (source) {\n if (url?.includes('/redirecting?')) {\n return url;\n }\n const params = new URLSearchParams();\n params.append('partner', source.toLowerCase());\n if (url?.includes('http')) {\n params.append('url', url);\n }\n if (!url) {\n params.append('url', '/');\n }\n return `${getBasePath()}/redirecting?${params.toString()}`;\n }\n\n if (url) {\n return url;\n }\n\n const idForRelativeLink = Number(id);\n const ownerTypeForLink = ownerType === 'partner' ? 'user' : ownerType;\n if (\n Number.isNaN(idForRelativeLink) ||\n type === 'sighting' ||\n (ownerTypeForLink !== 'user' && ownerTypeForLink !== 'awo')\n ) {\n throw new Error(\n `Cannot build details URL for pet ${id} with type ${type} and ownerType ${ownerType}`\n );\n }\n\n return getPetUrlPath({\n id: idForRelativeLink,\n searchType: type,\n ownerType: ownerTypeForLink,\n });\n}\n","/* eslint-disable jsdoc/tag-lines */\n/**\n * Helper function used to append a key:value pair to an object definition if\n * the value is not undefined.\n *\n * @example\n * const isUndefined = undefined;\n *\n * const objectWithNoUndefinedValues = {\n * key1: 'value1',\n * ...appendAttributeIfExists('newKey', 'not sure if is not undefined'),\n * ...appendAttributeIfExists('newKeyUndefined', isUndefined),\n * };\n *\n * // result { key1:'value1', newKey: 'not sure if is not undefined' }\n *\n * @param {string} key - The key of the key:value pair\n * @param {unknown} value - The value of the key:value pair\n * @returns {object} - The object used to append to the object definition\n */\nconst appendAttributeIfExists = (\n key: string,\n value: unknown\n): { [key: string]: unknown } => (value !== undefined ? { [key]: value } : {});\n\nexport default appendAttributeIfExists;\n","import { ContentfulClientApi, createClient } from 'contentful';\n/**\n * The Contentful client configuration object.\n * This configuration is used to create an instance of the Contentful client\n * that will be responsible for making API calls to the Contentful Content Delivery API.\n *\n * @property {string} space - The Contentful space ID, must be a non-null value.\n * @property {string} environment - The Contentful environment, must be a non-null value.\n * @property {boolean} retryOnError - If set to true, the client will retry requests that fail due to network errors.\n * @property {string} accessToken - Contentful access token, must be a non-null value.\n * @property {string} host - The API host URL of Contentful.\n */\n\nexport const contentful = createClient({\n space: `${process.env.CONTENTFUL_SPACE_ID}`,\n environment: `${process.env.CONTENTFUL_ENVIRONMENT}`,\n retryOnError: true,\n accessToken: `${process.env.CONTENTFUL_ACCESS_TOKEN}`,\n host: 'cdn.contentful.com',\n});\n\nexport const contentfulPreview = createClient({\n space: `${process.env.CONTENTFUL_SPACE_ID}`,\n environment: `${process.env.CONTENTFUL_ENVIRONMENT}`,\n accessToken: `${process.env.CONTENTFUL_ACCESS_TOKEN_PREVIEW}`,\n host: 'preview.contentful.com',\n});\n\n/**\n * Returns a client based on the preview flag.\n *\n * @param {boolean} preview - A boolean flag indicating whether to use the\n * preview client.\n * @returns {ContentfulClientApi} Contentful or contentfulPreview depending on\n * the preview flag.\n */\nexport const getClient = (preview: boolean) => {\n return preview ? contentfulPreview : contentful;\n};\n","import Heading from '@/components/atoms/Heading/Heading';\n\n/**\n * IShelterPageTitle - The props for the ShelterPageTitle component\n *\n * @interface IShelterPageTitle\n */\nexport interface IShelterPageTitle {\n /**\n * The shelter title.\n *\n * @memberof IShelterPageTitle\n * @member {string} title\n */\n title: string;\n}\n\n/**\n * ShelterPageTitle Shelter Page Title Component\n *\n * @param {IShelterPageTitle} props - The props for the ShelterPageTitle\n * component\n * @returns {React.FC<IShelterPageTitle>} ShelterPageTitle Component\n */\nconst ShelterPageTitle: React.FC<IShelterPageTitle> = ({\n title,\n}: IShelterPageTitle) => {\n return (\n <div\n className=\"w-full bg-base-100 flex justify-center text-center\"\n data-testid=\"shelter-page-title\"\n >\n <div className=\"sm:grid sm:grid-cols-6 md:grid-cols-12 gap-x-4 sm:gap-x-6 md:gap-x-8 max-w-[1440px] px-6 sm:px-8 md:px-10\">\n <Heading\n size=\"h1\"\n font=\"petco\"\n className=\"text-neutral-800 sm:py-16 py-12 col-start-2 col-span-4 md:col-start-4 md:col-span-6\"\n >\n {title}\n </Heading>\n </div>\n </div>\n );\n};\n\nexport default ShelterPageTitle;\n","import Button, { IButton } from '@/components/atoms/Button/Button';\nimport Heading from '@/components/atoms/Heading/Heading';\nimport Paragraph from '@/components/atoms/Paragraph/Paragraph';\nimport { ICardArticle } from '@/components/molecules/CardArticle/CardArticle';\nimport ShelterPageTitle from '@/components/molecules/ShelterPageTitle/ShelterPageTitle';\nimport ArticlesDisplay from '@/components/organisms/ArticlesDisplay/ArticlesDisplay';\nimport PageWrapper from '@/components/organisms/PageWrapper/PageWrapper';\nimport ShelterContactInformation from '@/components/organisms/ShelterContactInformation/ShelterContactInformation';\n\nimport useWindowSize from '@/component-library-lib/hooks/windowSize/WindowSize';\nimport getPetUrlPath from '@/lib/utils/getPetUrlPath/getPetUrlPath';\nimport Link from 'next/link';\nimport { useEffect, useState } from 'react';\n\n/**\n * The pet listing type. Awo pet listing type is 'foundOrgPet'\n *\n * @constant {string}\n */\nconst awoPetListingType = 'foundOrgPet';\n\n/**\n * IShelterDetails\n *\n * Used to define the text content for the Shelter Details\n *\n * @interface\n */\nexport interface IShelterDetails {\n /** The shelter name */\n name: string;\n /** The shelter address */\n address: string;\n /** The shelter phone number */\n phone: string;\n /** The shelter email */\n email: string;\n /** The shelter website */\n websiteUrl?: string;\n}\n\n/**\n * IShelterDetailsTemplateContent\n *\n * Used to define the text content for the Shelter Details Template\n *\n * @interface\n */\nexport interface IShelterDetailsTemplateContent {\n /** The Article Display Component content */\n articlesDisplay: {\n /** The title for the Article Display Component */\n title: string;\n };\n /** The link content */\n shelterContent: {\n /** The link content when accessing from a reclaim */\n reclaim: {\n /** The link title */\n title: string;\n };\n /** The link content when NOT accessing from a reclaim */\n other: {\n /** The link title */\n title: string;\n /** Buttons content */\n buttons: {\n /** Lost pet button text */\n lostPet: string;\n /** Found pet button text */\n foundPet: string;\n };\n };\n };\n /** The Shelter Contact Information Component content */\n shelterContactInformation: {\n /** The Shelter Contact Information Component overline */\n overline: string;\n };\n}\n\n/**\n * IShelterDetailsTemplate\n *\n * @interface\n */\nexport interface IShelterDetailsTemplate {\n /** The articles to display */\n articles: ICardArticle[];\n /** Text content */\n content: IShelterDetailsTemplateContent;\n /** The shelter details */\n shelterDetails: IShelterDetails;\n /** The optional listing id */\n listingId?: number;\n}\n\n/**\n * ShelterDetailsTemplate - This is the template to display shelter details\n *\n * @param {IShelterDetailsTemplate} props - The props for the\n * ShelterDetailsTemplate component\n * @returns {React.FC<IShelterDetailsTemplate>} Component\n */\nconst ShelterDetailsTemplate: React.FC<IShelterDetailsTemplate> = ({\n articles,\n content,\n shelterDetails,\n listingId,\n}) => {\n const size = useWindowSize();\n const [fullWidthButton, setFullWidthButton] = useState(false);\n\n /**\n * Monitor the Breakpoint that is being used and set the fullWidthButtons\n * state\n */\n useEffect(() => {\n if (size.breakpoint === 'xs') {\n setFullWidthButton(true);\n } else {\n setFullWidthButton(false);\n }\n }, [size.breakpoint]);\n\n /**\n * Buttons to display when the page is not accessed from a reclaim link\n *\n * @constant\n */\n const buttons: IButton[] = [\n {\n children: content.shelterContent.other.buttons.lostPet,\n type: 'button',\n size: 'md',\n variant: 'light',\n color: 'primary',\n href: '/i-lost-a-pet/',\n },\n {\n children: content.shelterContent.other.buttons.foundPet,\n type: 'button',\n size: 'md',\n variant: 'light',\n color: 'secondary',\n href: '/i-found-a-pet/',\n },\n ];\n\n return (\n <div data-testid=\"shelter-details-template\">\n <ShelterPageTitle title={shelterDetails.name} />\n <PageWrapper classes=\"mb-12 md:mb-20 px-6 sm:px-8 md:px-10\">\n <div className=\"block my-10 text-center sm:grid sm:grid-cols-6 sm:my-12 md:grid-cols-12 md:my-16 gap-x-4 sm:gap-x-6 md:gap-x-8\">\n <div className=\"col-start-2 col-span-4 md:col-start-4 md:col-span-6\">\n <Heading size=\"h2\" font=\"amasis\">\n {listingId\n ? content.shelterContent.reclaim.title\n : content.shelterContent.other.title}\n </Heading>\n <Paragraph size=\"body4\" className=\"mt-4\">\n {listingId ? (\n <>\n Please contact the shelter immediately and save this{' '}\n <Link\n href={getPetUrlPath({\n id: listingId,\n listingType: awoPetListingType,\n excludeBasePath: true,\n })}\n className=\"underline\"\n >\n {\"pet's listing\"}\n </Link>{' '}\n for when you reclaim your pet. We do not notify the shelter\n that this is your pet\n </>\n ) : (\n <>\n Search 100,000+ pets using our free lost and found pet\n database to reunite with your pet or to help a pet you found\n get back to its owner.\n </>\n )}\n </Paragraph>\n {!listingId && (\n <div className=\"flex flex-col justify-center space-y-[21px] sm:flex-row sm:space-y-0 sm:space-x-6 md:space-x-8 mt-8\">\n {buttons.map((button, index) => {\n return (\n <Button\n key={index}\n {...button}\n fullWidth={fullWidthButton}\n />\n );\n })}\n </div>\n )}\n </div>\n <ShelterContactInformation\n overline={\n listingId ? content.shelterContactInformation.overline : ''\n }\n name={shelterDetails.name}\n address={shelterDetails.address}\n phone={shelterDetails.phone}\n email={shelterDetails.email}\n website={shelterDetails.websiteUrl}\n classes=\"col-start-2 col-span-4 md:col-start-3 md:col-span-8 mt-10 sm:mt-12 md:mt-16\"\n />\n </div>\n <ArticlesDisplay\n articles={articles}\n title={content.articlesDisplay.title}\n classes=\"mb-12 md:mb-20\"\n />\n </PageWrapper>\n </div>\n );\n};\n\nexport default ShelterDetailsTemplate;\n","\n/**\n * A mapping of US state names to their corresponding state codes.\n */\nexport const usStateCodes: Record<string, string> = {\n Alabama: 'AL',\n Alaska: 'AK',\n Arizona: 'AZ',\n Arkansas: 'AR',\n California: 'CA',\n Colorado: 'CO',\n Connecticut: 'CT',\n Delaware: 'DE',\n 'District of Columbia': 'DC',\n Florida: 'FL',\n Georgia: 'GA',\n Hawaii: 'HI',\n Idaho: 'ID',\n Illinois: 'IL',\n Indiana: 'IN',\n Iowa: 'IA',\n Kansas: 'KS',\n Kentucky: 'KY',\n Louisiana: 'LA',\n Maine: 'ME',\n Maryland: 'MD',\n Massachusetts: 'MA',\n Michigan: 'MI',\n Minnesota: 'MN',\n Mississippi: 'MS',\n Missouri: 'MO',\n Montana: 'MT',\n Nebraska: 'NE',\n Nevada: 'NV',\n 'New Hampshire': 'NH',\n 'New Jersey': 'NJ',\n 'New Mexico': 'NM',\n 'New York': 'NY',\n 'North Carolina': 'NC',\n 'North Dakota': 'ND',\n Ohio: 'OH',\n Oklahoma: 'OK',\n Oregon: 'OR',\n Pennsylvania: 'PA',\n 'Rhode Island': 'RI',\n 'South Carolina': 'SC',\n 'South Dakota': 'SD',\n Tennessee: 'TN',\n Texas: 'TX',\n Utah: 'UT',\n Vermont: 'VT',\n Virginia: 'VA',\n 'Virgin Islands': 'VI',\n Washington: 'WA',\n 'West Virginia': 'WV',\n Wisconsin: 'WI',\n Wyoming: 'WY',\n};\n","/**\n * Abbreviates some parts of the address.\n *\n * For example, '1234 Main Street' becomes '1234 Main St.', '1234 Main Road'\n * becomes '1234 Main Rd.', etc.\n *\n * @param {string} address - The address to abbreviate\n * @returns {string} The abbreviated address\n */\nexport function abbreviateAddress(address?: string) {\n if (!address) {\n return '';\n }\n\n const abbreviations: { [key: string]: string } = {\n Street: 'St.',\n Road: 'Rd.',\n Avenue: 'Ave.',\n Boulevard: 'Blvd.',\n Drive: 'Dr.',\n Lane: 'Ln.',\n Terrace: 'Terr.',\n Place: 'Pl.',\n Court: 'Ct.',\n };\n\n let abbreviatedAddress = address;\n\n Object.keys(abbreviations).forEach((word) => {\n const regex = new RegExp('\\\\b' + word + '\\\\b', 'i');\n abbreviatedAddress = abbreviatedAddress.replace(regex, abbreviations[word]);\n });\n\n return abbreviatedAddress;\n}\n","import { sdk } from '@/lib/dataSource/lostApi/common';\nimport { IAwoLegacyContextLegacyIdResponseData } from '@petcolove/lost--client--api-sdk/dist/concrete/sdks/services/awo/legacyContext/interfaces';\n\n/**\n * Function to check if the awo is manual from the legacy context\n *\n * @param {string} legacyId - The legacy id\n * @returns {Promise<IAwoLegacyContextLegacyIdResponseData>} The response\n */\nexport async function getAwoEntityId(\n legacyId: string\n): Promise<IAwoLegacyContextLegacyIdResponseData> {\n try {\n const { data } = await sdk.publicAwoLegacyContext({}).legacyId(legacyId);\n return data;\n } catch (error) {\n console.error(error);\n throw error;\n }\n}\n","/**\n * Converts a hexadecimal string to a string\n *\n * @param {string} hexadecimal - The hexadecimal string to convert\n * @returns {string} Str\n */\nexport default function hexadecimalToString(hexadecimal: string): string {\n try {\n return decodeURIComponent(hexadecimal.replace(/(..)/g, '%$1'));\n } catch (e) {\n console.error(e);\n\n throw new Error(`invalid hex input: ${hexadecimal}`);\n }\n}\n","/* eslint-disable jsdoc/tag-lines */\nimport { contentful } from '@/component-library-lib/dataSource/contentful/client';\nimport { Topics } from '@/component-library-lib/dataSource/contentful/models/topics';\nimport { ICardArticle } from '@/components/molecules/CardArticle/CardArticle';\nimport Head from '@/components/templates/Head/Head';\nimport ShelterDetailsTemplate, {\n IShelterDetails,\n} from '@/components/templates/ShelterDetailsTemplate/ShelterDetailsTemplate';\nimport { shelterDetailsArticlesSlugNames } from '@/lib/constants/constants/articles';\nimport { usStateCodes } from '@/lib/constants/constants/us-states';\nimport Article, { IContent } from '@/lib/dataSource/content/article';\nimport { abbreviateAddress } from '@/lib/dataSource/location/abbreviateAddress';\nimport getLocationLabel from '@/lib/dataSource/location/getLocationLabel';\nimport { getAwoEntityId } from '@/lib/dataSource/lostApi/awo/legacyContext/legacyId';\nimport { getAwoDetails } from '@/lib/dataSource/lostApi/awos/details';\nimport hexadecimalToString from '@/lib/utils/helpers/legacy/hexadecimalToString';\nimport stringToSlug from '@/lib/utils/helpers/legacy/stringToSlug';\nimport appendAttributeIfExists from '@/lib/utils/helpers/ObjectsHelpers/AppendAttributeIfExists';\nimport { addHttps } from '@/lib/utils/stringReplace/addHttps';\nimport { ArticleProps } from '@/pages/articles/[slug]';\nimport { documentToReactComponents } from '@contentful/rich-text-react-renderer';\nimport { IServiceMethodResponse } from '@petcolove/lost--client--api-sdk/dist/abstract/service/interfaces';\nimport { IAWODetailsDTO } from '@petcolove/lost--client--api-sdk/dist/concrete/sdks/services/awo/details/dto';\nimport { GetServerSideProps, GetServerSidePropsContext, NextPage } from 'next';\n\n/**\n * IShelterDetailsPageMeta The Article Page Meta Interface for the Shelter\n * Details Page.\n *\n * @interface\n */\ninterface IShelterDetailsPageMeta {\n /** The title of the page */\n title: string;\n /** The description of the page */\n description: string;\n}\n\n/**\n * IArticlePage The Article Page Interface for the Shelter Details Page.\n *\n * @interface\n */\ninterface IShelterDetailsPage {\n /** The articles to display */\n articles: ICardArticle[];\n /** The city and state of the shelter */\n locationName: string;\n /** The meta data for the page */\n meta: IShelterDetailsPageMeta;\n /** The shelter details */\n shelterDetails: IShelterDetails;\n /** The optional listing id */\n listingId?: number;\n}\n\n/**\n * Shelter details looks for query params and renders the appropriate reclaim\n * status\n *\n * @example\n * /shelters/shelter-name/1 will render the shelter details page with reclaim status false\n * /shelters/shelter-name/1?listing=2 will render the shelter details page with reclaim status true\n *\n * @param {IShelterDetails} props - The props of the Article Page Component.\n * @returns {NextPage<IShelterDetails>} Shelter Details Page\n */\nconst ShelterDetails: NextPage<IShelterDetailsPage> = ({\n articles,\n locationName,\n meta,\n shelterDetails,\n listingId,\n}: IShelterDetailsPage) => {\n return (\n <section className=\"mx-auto\" data-testid=\"shelter-details-page\">\n <Head {...meta} />\n <ShelterDetailsTemplate\n articles={articles}\n shelterDetails={shelterDetails}\n content={{\n articlesDisplay: {\n title: 'Helpful Articles',\n },\n shelterContent: {\n reclaim: {\n title: \"Let's get your pet home!\",\n },\n other: {\n title: `Search pets near ${locationName}`,\n buttons: {\n lostPet: 'I Lost a Pet',\n foundPet: 'I Found a Pet',\n },\n },\n },\n shelterContactInformation: {\n overline: 'This pet is located at',\n },\n }}\n listingId={listingId}\n />\n </section>\n );\n};\nexport default ShelterDetails;\n\n/**\n * Redirects to the home page if the user is not authenticated\n *\n * @param {GetServerSidePropsContext} context - The request object\n * @returns {GetServerSideProps} - The props object\n */\nexport const getServerSideProps = async ({\n params,\n query,\n}: GetServerSidePropsContext): GetServerSideProps => {\n try {\n /**\n * The array of slugs and ids from the url\n *\n * @property {string} slug - The slug value.\n * @property {string} id - The id value.\n */\n const { id } = params;\n /**\n * @property {number} listing - The listingId if the request is coming from\n * a listing page\n */\n const { listing } = query;\n /**\n * Wether if the request is coming from a legacy shelter url or not.\n *\n * @constant {boolean} isLegacyShelter - If the request is coming from a\n */\n const fromLegacyUrl = isFromLegacyUrl(id);\n\n /**\n * The shelter id.\n *\n * @constant {number} shelterId - The shelter id from the context\n */\n const shelterId = fromLegacyUrl\n ? await getEntityIdFromLegacyId(id)\n : parseInt(params.id);\n\n if (!shelterId) {\n return {\n notFound: true,\n };\n }\n\n /** The awo details. */\n const awo: IAWODetailsDTO = await getAwoDetails(shelterId);\n\n const { name, status } = awo;\n\n if (status !== 'active') {\n return {\n notFound: true,\n };\n }\n\n /**\n * The shelter name as a slug\n *\n * @constant {string} shelterNameSlug - The shelter name as a slug\n */\n const shelterSlugName = stringToSlug(name);\n\n /**\n * If the request is coming from a legacy url, we will try to redirect to\n * the right url only if the slug is the same as the shelter name,\n * otherwise, we will redirect to the 404 page\n */\n if (fromLegacyUrl)\n return getServerSidePropsForLegacyUrl(shelterId, shelterSlugName);\n\n return await getServerSidePropsForShelter(awo, listing);\n } catch (error) {\n console.error(error);\n\n if ((error as IServiceMethodResponse)?.statusCode === 404) {\n return {\n notFound: true,\n };\n }\n\n throw error;\n }\n};\n\n/**\n * Whether if the request is coming from a legacy url or not. The legacy id is a\n * decimal or hexadecimal value of exactly 20 characters.\n *\n * @example\n * /shelters/name-of-the-shelter/387a647349513657424f -> legacy url (hex)\n * /shelters/name-of-the-shelter/38746473495136574241 -> legacy url (dec)\n * /shelters/name-of-the-shelter/123 -> not a legacy url\n *\n * @param {string} id - The awo legacy id or entity id\n * @returns {boolean} - If the request is coming from a legacy url or not\n */\nexport const isFromLegacyUrl = (id: string): boolean => {\n return id.length === 20;\n};\n\n/**\n * Get the legacy shelter id from the slug\n *\n * @param {string} encodedLegacyId - The encoded legacy id\n * @returns {Promise<number>} - The legacy shelter id\n */\nexport const getEntityIdFromLegacyId = async (\n encodedLegacyId: string\n): Promise<number | undefined> => {\n try {\n /**\n * The decoded legacy id\n *\n * @constant {string} legacyId - The decoded legacy id\n */\n const legacyId = hexadecimalToString(encodedLegacyId);\n /**\n * The awo entity id\n *\n * @property {number} awoEntityId - The awo entity id\n */\n const { awoEntityId } = await getAwoEntityId(legacyId);\n\n return awoEntityId;\n } catch (error) {\n console.error(error);\n\n return;\n }\n};\n\n/**\n * Handle server side props for legacy urls\n *\n * @param {number} shelterId - The entity id of the legacy shelter\n * @param {string} shelterSlugName - The original slug name of the shelter\n * @returns {GetServerSideProps} - The props object\n */\nexport const getServerSidePropsForLegacyUrl = (\n shelterId: number,\n shelterSlugName: string\n): GetServerSideProps => {\n return {\n props: {},\n redirect: {\n destination: `/shelters/${shelterSlugName}/${shelterId}`,\n permanent: false,\n },\n };\n};\n\n/**\n * Handle server side props for shelter details\n *\n * @param {IAWODetailsDTO} awo - The awo details\n * @param {string} [listing] - The listing id\n * @returns {GetServerSideProps} - The props object\n */\nexport const getServerSidePropsForShelter = async (\n awo: IAWODetailsDTO,\n listing?: string\n): Promise<GetServerSideProps> => {\n /**\n * The shelter details\n *\n * @property {string | null} [location] - The location of the shelter\n * @property {string} [name] - The name of the shelter\n * @property {string} [phoneNumber] - The phone number of the shelter\n * @property {string} [contactEmail] - The contact email of the shelter\n */\n const { location, name, phoneNumber, contactEmail, websiteUrl } = awo;\n\n /** Throw an error if the required data to display the page is missing */\n if (!location || !name) throw new Error('Missing location or name');\n\n const dataArticles = await contentful.withoutUnresolvableLinks.getEntries<\n Topics['Article']\n >({\n content_type: 'article',\n 'fields.slugs[in]': shelterDetailsArticlesSlugNames,\n locale: 'en-US',\n include: 10,\n });\n\n const articles = dataArticles.items.map((item: ArticleProps) => {\n const displayDate = new Date(item.fields.publishDate);\n const articleContent = {\n title: item.fields.headline,\n slug: item.fields.slugs,\n contentBody: documentToReactComponents(item.fields.copy),\n excerpt: item.fields.excerpt,\n authorName: item.fields.author?.fields.name,\n authorSlug: item.fields.author?.fields.slugs,\n categoryId: item.fields.context,\n featuredPhoto: addHttps(item.fields.featuredImage?.fields?.file?.url),\n publishedDate: displayDate,\n } as IContent;\n return new Article(articleContent);\n });\n\n /**\n * Get the card article object from the article object\n *\n * @constant {ICardArticle[]} helpfulArticles - Articles cards for the\n * articles display component\n */\n const helpfulArticles = articles\n .map((article) => article.getCardArticle())\n .filter((article) =>\n Object.values(article).every((value) => value !== undefined)\n );\n /**\n * The location address components\n *\n * @property {string} streetAddress - The street address\n * @property {string} postalCode - The postal code\n * @property {string} region - The region\n * @property {string} country - The country\n */\n const {\n streetAddress: address,\n postalCode: zip,\n region: state,\n city,\n } = location;\n\n /**\n * The shelter details\n *\n * @constant {IShelterDetails} shelterDetails - The shelter details\n */\n const shelterDetails = {\n name: name,\n address: getLocationLabel({\n address: abbreviateAddress(address),\n city,\n zip,\n state: usStateCodes[state] || state,\n }),\n ...appendAttributeIfExists('email', contactEmail),\n ...appendAttributeIfExists('phone', phoneNumber),\n ...appendAttributeIfExists('websiteUrl', websiteUrl),\n };\n\n /**\n * The name of the shelter location\n *\n * @constant {string} locationName - The location name\n */\n const locationName = `${location?.city}, ${location?.region}`;\n\n /**\n * The meta object for the page\n *\n * @constant {IShelterDetailsPageMeta} meta - The meta data for the page\n */\n const meta: IShelterDetailsPageMeta = {\n title: `${shelterDetails.name}`,\n description: `Search lost and found pets neat ${shelterDetails.name} in ${locationName}. Find contact information for ${shelterDetails.name} at Petco Love Lost`,\n };\n\n return {\n props: {\n locationName,\n meta,\n articles: helpfulArticles,\n shelterDetails: shelterDetails,\n ...appendAttributeIfExists('listingId', listing),\n },\n };\n};\n"],"names":["window","__NEXT_P","push","__webpack_require__","__webpack_exports__","Z","children","from","to","delay","duration","className","param","ref","useRef","controls","useAnimation","inView","useInView","useEffect","start","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__","jsx","motion","div","initial","animate","variants","hidden","opacity","visible","scale","translateX","translateY","transition","ease","cubicBezier","variantClasses","primary","light","dark","lightBlue","pink","secondary","tertiary","disabledStyles","removeFocusStyles","variant","href","as","disabled","replace","scroll","shallow","passHref","color","rest","variantStyles","cls","wrapperFocusStyles","concat","Link","src","width","quality","IconButton","label","icon","onClick","testid","jsxs","button","Icon","size","span","address","email","phone","emailSubject","website","classes","formattedPhone","test","formatPhoneNumber","open","CardArticle_CardArticle","title","excerpt","image","url","imageClasses","target","loader","jsx_runtime","Image","layout","alt","objectFit","sizes","Paragraph","ArticlesDisplay_ArticlesDisplay","articles","buttonLink","AnimateItem","Heading","font","ButtonLink","map","article","index","CardArticle","contentFulImageLoader","overline","name","styling","ContactOrganization","shelterDetailsArticlesSlugNames","foundSearchArticleSlugNames","lostSearchArticleSlugNames","microchipSearchArticlesSlugNames","unknownValue","baseAgeValues","Array","length","value","toString","petDropdownUnknownValue","ageValues","petSexDropdownValues","speciesDropdownValues","alteredDropdownValues","searchRadiusOptions","validStatus","petUrlPathOwnerTypes","user","awo","petUrlPathSearchTypes","lostUserPet","foundUserPet","foundOrgPet","ContentType","ContentStatus","Content","constructor","type","status","Article","getTitle","getFeaturedPhoto","featuredPhoto","getSlug","slug","getAuthorUrl","authorBasePath","authorSlug","getContent","contentBody","getFormattedPublishedDate","date","Date","publishedDate","toLocaleDateString","year","month","day","getArticleUrl","articlesBasePath","getCardArticle","authorName","categoryId","Published","zip","city","state","countryCode","placeLabel","placeLabelItems","undefined","forEach","item","str","sdk","initSDK","pllApiBaseUrl","process","pllWebsocketBaseUrl","PetcoLoveSDK","pattern","numericValue","formattedValue","substring","getOwnerTypeSegment","ownerType","listingType","toLowerCase","includes","getPetUrlPath","params","id","excludeBasePath","ownerTypeSegment","searchTypeSegment","getBasePath","searchType","petType","getPetUrl","source","URLSearchParams","append","idForRelativeLink","Number","ownerTypeForLink","isNaN","key","contentful","createClient","space","env","CONTENTFUL_SPACE_ID","environment","CONTENTFUL_ENVIRONMENT","retryOnError","accessToken","CONTENTFUL_ACCESS_TOKEN","host","CONTENTFUL_ACCESS_TOKEN_PREVIEW","ShelterPageTitle_ShelterPageTitle","ShelterDetailsTemplate_ShelterDetailsTemplate","content","shelterDetails","listingId","useWindowSize","fullWidthButton","setFullWidthButton","useState","breakpoint","buttons","shelterContent","other","lostPet","foundPet","ShelterPageTitle","PageWrapper","reclaim","Fragment","Button","fullWidth","ShelterContactInformation","shelterContactInformation","websiteUrl","ArticlesDisplay","articlesDisplay","usStateCodes","Alabama","Alaska","Arizona","Arkansas","California","Colorado","Connecticut","Delaware","Florida","Georgia","Hawaii","Idaho","Illinois","Indiana","Iowa","Kansas","Kentucky","Louisiana","Maine","Maryland","Massachusetts","Michigan","Minnesota","Mississippi","Missouri","Montana","Nebraska","Nevada","Ohio","Oklahoma","Oregon","Pennsylvania","Tennessee","Texas","Utah","Vermont","Virginia","Washington","Wisconsin","Wyoming","getAwoEntityId","legacyId","data","publicAwoLegacyContext","error","_id_","locationName","meta","section","Head","ShelterDetailsTemplate","isFromLegacyUrl","getEntityIdFromLegacyId","encodedLegacyId","hexadecimalToString","hexadecimal","decodeURIComponent","e","awoEntityId","getServerSidePropsForLegacyUrl","shelterId","shelterSlugName","props","redirect","destination","permanent","getServerSidePropsForShelter","listing","location","phoneNumber","contactEmail","dataArticles","withoutUnresolvableLinks","getEntries","content_type","locale","include","items","displayDate","fields","publishDate","articleContent","headline","slugs","documentToReactComponents","copy","author","context","addHttps","featuredImage","file","helpfulArticles","filter","Object","values","every","streetAddress","postalCode","region","getLocationLabel","abbreviateAddress","abbreviations","Street","Road","Avenue","Boulevard","Drive","Lane","Terrace","Place","Court","abbreviatedAddress","keys","regex","word","appendAttributeIfExists","description"],"sourceRoot":""}